from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
import time


def run(model_path="/root/.cache/Qwen2.5-Coder-32B/"):
    ######################
    model_name = model_path
    ######################
    model = AutoModelForCausalLM.from_pretrained(
        model_name,
        torch_dtype=torch.float16,
        device_map="auto"
    )
    print("RUN deive on:", model.device)
    tokenizer = AutoTokenizer.from_pretrained(model_name)
    prompt = "Give me a short introduction to large language model."
    messages = [
        {"role": "system", "content": "You are Qwen, created by Alibaba Cloud. You are a helpful assistant."},
        {"role": "user", "content": prompt}
    ]
    text = tokenizer.apply_chat_template(
        messages,
        tokenize=False,
        add_generation_prompt=True
    )
    model_inputs = tokenizer([text], return_tensors="pt").to(model.device)

    ########### 推理 #####################
    start_time = time.time()
    generated_ids = model.generate(
        **model_inputs,
        max_new_tokens=128
    )
    end_time = time.time()

    print("TPS=", len(generated_ids[0])/(end_time-start_time))
    ########### 推理 #####################
    generated_ids = [
        output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
    ]

    response = tokenizer.batch_decode(
        generated_ids, skip_special_tokens=True)[0]
    print(response)


# Usage:
# python test.py --model_path=/root/.cache/Qwen2.5-Coder-32B/
# python test.py --model_path=Qwen2.5-Coder-32B-GPTQ-Int4

if __name__ == "__main__":
    from fire import Fire
    Fire(run)
